package com.snail.response;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.snail.exception.ErrorCode;

import java.util.List;

/**
 * @author Monica
 * @description
 * @date 2025/7/10 15:21
 */
public class ResultUtils {

    /**
     * 成功
     *
     * @param data 数据
     * @param <T>  数据类型
     * @return 响应
     */
    public static <T> BaseResponse<T> success(T data) {
        return new BaseResponse<>(0, data, "ok");
    }

    /**
     * 成功
     *
     * @param <T> 数据类型
     * @return 响应
     */
    public static <T> BaseResponse<T> success() {
        return new BaseResponse<>(0, null, "ok");
    }


    /**
     * 失败
     *
     * @param errorCode 错误码
     * @return 响应
     */
    public static BaseResponse<?> error(ErrorCode errorCode) {
        return new BaseResponse<>(errorCode);
    }

    /**
     * 失败
     *
     * @param msg 错误信息
     * @return 响应
     */
    public static BaseResponse<?> error(String msg) {
        return new BaseResponse<>(ErrorCode.SYSTEM_ERROR.getCode(), msg);
    }


    /**
     * 失败
     *
     * @param code    错误码
     * @param message 错误信息
     * @return 响应
     */
    public static BaseResponse<?> error(int code, String message) {
        return new BaseResponse<>(code, null, message);
    }

    /**
     * 失败
     *
     * @param code    错误码
     * @param data    数据
     * @param message 错误信息
     * @param <T>     数据类型
     * @return 响应
     */
    public static <T> BaseResponse<T> error(int code, T data, String message) {
        return new BaseResponse<>(code, data, message);
    }

    /**
     * 失败
     *
     * @param errorCode 错误码
     * @return 响应
     */
    public static BaseResponse<?> error(ErrorCode errorCode, String message) {
        return new BaseResponse<>(errorCode.getCode(), null, message);
    }

    /**
     * 成功分页响应
     *
     * @param page MyBatis-Plus分页对象
     * @return 分页响应
     */
    public static <T> PageResponse<T> pageSuccess(IPage<T> page) {
        return pageSuccess(page.getRecords(), page.getTotal());
    }

    /**
     * 成功分页响应(自定义数据)
     *
     * @param records 当前页数据列表
     * @param total   总记录数
     * @return 分页响应
     */
    public static <T> PageResponse<T> pageSuccess(List<T> records, long total) {
        PageResponse<T> response = new PageResponse<>();
        response.setCode(0);
        response.setMsg("ok");

        PageResponse.Data<T> pageData = new PageResponse.Data<>();
        pageData.setList(records);
        pageData.setTotal(total);

        response.setData(pageData);
        return response;
    }

    /**
     * 失败分页响应
     *
     * @param errorCode 错误码枚举
     * @return 分页响应
     */
    public static <T> PageResponse<T> pageError(ErrorCode errorCode) {
        return pageError(errorCode.getCode(), errorCode.getMessage());
    }

    /**
     * 失败分页响应(自定义消息)
     *
     * @param errorCode 错误码枚举
     * @param message   自定义错误消息
     * @return 分页响应
     */
    public static <T> PageResponse<T> pageError(ErrorCode errorCode, String message) {
        return pageError(errorCode.getCode(), message);
    }

    /**
     * 失败分页响应
     *
     * @param code    错误码
     * @param message 错误消息
     * @return 分页响应
     */
    public static <T> PageResponse<T> pageError(int code, String message) {
        PageResponse<T> response = new PageResponse<>();
        response.setCode(code);
        response.setMsg(message);
        return response;
    }
}

